package com.zxc.upload.web;

import com.zxc.common.vo.FileVo;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.UUID;

@RestController
public class UploadController {

    @Value("${zxc.upload}")
    private String path;

    /**
     * 如果上传成功，返回保存地址
     * @param file
     * @return
     * @throws Exception
     * 访问地址： http://api.shopping.com/api/upload/img
     *
     */
    @PostMapping("/img")
    public ResponseEntity<FileVo> up(MultipartFile file) throws  Exception{

        //获得保存上传文件的目录位置

        //获得上传的文件名
        String fname = file.getOriginalFilename(); //假设，当前上传的文件名是:       1.jpg

        /*******************为了防止上传文件时，文件名重名，文件覆盖的问题，上传时，保存在本地的文件名，并不会是真实的文件名**********/
        //1、要获得用户上传的文件类型
        String type = fname.substring(fname.lastIndexOf(".")+1); //jpg
        //2、用uuid生成一个文件名
        String newFileName = UUID.randomUUID()+"."+type;

        /**************************************************************/
        //在指定目录下，创建一个指定名称的新文件（空文件）
        File newFile = new File(path,newFileName);

        //将上传文件中的数据，写入到新文件
        file.transferTo(newFile);

        //得到文件保存地址
        String url = newFile.getAbsolutePath();

        System.out.println(url+"-----------------------------");



        /****************************向fastdfs上传文件***********************************************/
        FileVo vo  = new FileVo();

        try{
            ClientGlobal.initByProperties("fastdfs-client.properties");


            TrackerClient tracker = new TrackerClient();
            TrackerServer trackerServer = tracker.getConnection();
            StorageServer storageServer = null;
            StorageClient1 client = new StorageClient1(trackerServer, storageServer);

            NameValuePair[] metaList = new NameValuePair[1];
            metaList[0] = new NameValuePair("fileName", newFileName);
            String fileId = client.upload_file1(newFile.getAbsolutePath(), type, metaList);
            String address  = "http://img.shopping.com/"+fileId;
            System.out.println("存储的位置:"+address);

            //上传成功后，将信息封装到vo中
            vo.setCode(0);//成功
            vo.setData(address);//文件保存在fastdfs服务器中的位置
            return ResponseEntity.status(HttpStatus.CREATED).body(vo);
        }catch(Exception ex){
            //如果有异常，表示，上传到fastdfs服务失败了
            vo.setCode(1);//上传失败
            vo.setMsg("上传文件失败");
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(vo);
        }
    }
}
